import router, { constantRoutes, routerSpace } from './router'

import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style

import getPageTitle from '@/utils/get-page-title'
import store from './store'
import { Message } from 'element-ui'

NProgress.configure({ showSpinner: false }) // NProgress Configuration

// 定义一个白名单
const whiteList = ['/login']

router.beforeEach(async(to, from, next) => {
  // start progress bar
  NProgress.start()
  // set page title
  document.title = getPageTitle(to.meta.title)
  const token = store.getters.token
  // console.log(token)
  // 1。如果有token,去登录－重定向到首页
  // 有token没有白名单也放行
  if (token) {
    to.path === '/login' ? next('/') : next()
    // 判断有没有id  如果有就不再执行dispatch  如果没有就从user文件中触发用户信息请求
    // !store.getters.userId && store.dispatch('user/userActionApi')
    if (!store.getters.userId) {
      await store.dispatch('user/userActionApi')
      // 从用户信息中获取roles.menus 权限菜单
      const menus = store.state.user.userinfo.roles.menus
      // 如何过滤：判断menus中的元素， 是否与 path 去掉了 / 相等
      const newRoutes = routerSpace.filter(i => {
        const path = i.path.slice(1) // 使用path
        // 使用name
        // console.log(i)
        return menus.includes(path)
        // 返回  相同的path
      })
      // 在导航守卫中，把过滤后的权限路由，调用mutation存到vnex
      store.commit('user/svaRouters', [...constantRoutes, ...newRoutes])
      // 添加到路由中   展开数组   有个小bug 这个方法是push原理，需要把404添加到后面
      router.addRoutes([...newRoutes, { path: '*', redirect: '/404', hidden: true }])
    }

    NProgress.done()
    return
  }
  // 3。如果没有token，去的是白名单－放行
  // 如果没有token也没有去白名单就重定向到登录页
  if (whiteList.includes(to.path)) {
    next()
    NProgress.done()
    return
  } else {
    NProgress.done()
    Message.info('请先登录')
    next('/login')
    return
  }
})

router.afterEach(() => {
  // finish progress bar
  NProgress.done()
})
//  NProgress控制页面加载进度条
